#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
    @Author 黄海峰
    @Date 2021/4/14 15:01
    @Version 1.0.0
"""
import datetime
from operator import itemgetter

# 变量可以指向函数
a = abs
print(a(-10))


# 一个函数可以接受另一个函数作为参数
def add(x, y, a):
    return a(x) + a(y)


print(add(-10, 2, a))


def b(x):
    return x * x


r = map(b, [1, 2, 4])
print(list(r))

print(list(map(str, [1, 2, 3])))


def is_odd(n):
    return n % 2 == 1


print(list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])))

print(sorted([36, 2, -1, -12, 77]))

students = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
print(sorted(students, key=itemgetter(1), reverse=False))


def hhf_add(*args):
    def add2():
        x = 0
        for item in args:
            x = x + item
        return x

    return add2


print(hhf_add(11))
print(hhf_add(111, 222)())


# 闭包问题，当一个函数返回了一个函数，其内部的局部变量还是会被新函数引用，所以必须采用闭包进行解决
# 重点：闭包使用牢记一点，返回函数不要引用任何循环变量，或者后续会发生变化的变量。
def count():
    fs = []
    for i in range(1, 4):
        def f():
            return i * i

        fs.append(f)
    return fs


f1, f2, f3 = count()
print(f1(), f2(), f3())


def count():
    def f(j):
        def g():
            return j * j

        return g

    fs = []
    for i in range(1, 4):
        fs.append(f(i))  # f(i)立刻被执行，因此i的当前值被传入f()
    return fs


f4, f5, f6 = count()
print(f4(), f5(), f6())

# 匿名函数
la = lambda x: x * x
print(la(5))

# 获取函数的名字
print(la.__name__)
print(la.__class__)

# 装饰器，雷士java的AOP实现日志打印
print('======================')


def log(func):
    def warpper(*args, **kwargs):
        print('call %s:' % func.__name__)
        return func(*args, **kwargs)

    return warpper


import time


@log
def now():
    print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))


print(now())
print('======================')
